// 139. 单词拆分(完全背包)
// 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。
// 请你判断是否可以利用字典中出现的单词拼接出 s 。

// 注意：不要求字典中出现的单词全部都使用，并且字典中的单词可以重复使用。

// 示例 1：

// 输入: s = "leetcode", wordDict = ["leet", "code"]
// 输出: true
// 解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
// 思路：1. dp数组初始化 false dp[0]=true
// 2. 公式 数组拆分 如果确定dp[j] 是true，且 [j, i] 这个区间的子串出现在字典里，
// 那么dp[i]一定是true。（j < i ）。 使用slice
// 3. 循环遍历 先遍历背包或者物品都可以

/**
 * @param {string} s
 * @param {string[]} wordDict
 * @return {boolean}
 */
 var wordBreak = function(s, wordDict) {
    const dp=new Array(s.length+1).fill(false);
    dp[0]=true;
    for(let i=0;i<=s.length;i++){// 先遍历背包
        for(let j=0;j<wordDict.length;j++){// 遍历物品
            if(i>=wordDict[j].length){// s.slice(i-wordDict[j].length,i)===wordDict[j] 重要
                if(s.slice(i-wordDict[j].length,i)===wordDict[j]&&dp[i-wordDict[j].length]){
                    dp[i]=true;
                }
            }
        }
    }
    return dp[s.length];
 }